package com.wang.wangapiinterface.controller;

import cn.hutool.json.JSONUtil;
import com.wang.wangapiinterface.model.User;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import static com.wang.wangapiclientsdk.utils.SignUtil.genSign;

@RestController
@RequestMapping("/name")
public class NameController {
    @GetMapping("/getName")
    public String getNameByGet(String name) {
        return "GET 你的名字是" + name;
    }
    @PostMapping("/postUrl")
    public String getNameByPost(@RequestParam String name) {
        return "POST URL 你的名字是" + name;
    }

    @PostMapping("/postJson")
    public String getUsernameByPost(@RequestBody User user, HttpServletRequest request) {
        String accessKey = request.getHeader("accessKey");
        String body = request.getHeader("body");
        String nonce = request.getHeader("nonce");
        String timestamp = request.getHeader("timestamp");
        String sign = request.getHeader("sign");


        /*
        (1) 校验 ak
        TODO 实际情况是从数据库中查出 ak
         */
        if (!StringUtils.hasText(accessKey)) {
            throw new RuntimeException("accessKey不能为空");
        }

        /*
        (2) 校验body  确保header中的body与实际请求体一致, 防篡改
         */
        if (!StringUtils.hasText(body)) {
            throw new RuntimeException("body不能为空");
        }
        try {
            // 将请求体User对象序列化为JSON, 与header中的body对比
            String requestBodyJson = JSONUtil.toJsonStr(user);
            if (!body.equals(requestBodyJson)) {
                throw new RuntimeException("请求体与body不一致，可能被篡改");
            }
        } catch (RuntimeException e) {
            throw new RuntimeException("请求体序列化失败", e);
        }

        /*
        (3) 校验nonce随机数, 防重放攻击 (确保同一nonce在有效时间内不重复)
         */
        if (!StringUtils.hasText(nonce)) {
            throw new RuntimeException("nonce不能为空");
        }

        /*
        (4) 校验 timestamp 时间戳
        时间和当前时间间隔不能超过5分钟
         */
        if (!StringUtils.hasText(timestamp)) {
            throw new RuntimeException("timestamp不能为空");
        }

        /*
        (5) 校验签名
        TODO 实际情况是从数据库中查出 sk
         */
        if (!StringUtils.hasText(sign)) {
            throw new RuntimeException("sign不能为空");
        }
        String serverSign = genSign(body, "123456");
        if (!sign.equals(serverSign)) {
            throw new RuntimeException("签名不一致, 无权限");
        }

        return "POST JSON 你的名字是 " + user.getUsername();
    }
}
